/**
 * Camada de acesso aos dados da Selecao no modelo DAO 
 * 	
 * @author Esdras
 *
 */
package Repositorio;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import ClassesBasicas.Copa;
import ClassesBasicas.Pais;
import ClassesBasicas.Selecao;
import Conexao.GConexao;
import Conexao.IConexao;
import erro.ConexaoException;
import erro.RepositorioException;

public class RepSelecao implements IRepSelecao {
	
	/* Representa o GConexao */
	private IConexao conexao;
	
	/**Quando o objeto RepPais for instanciado
	 * este construtor ir� instanciar o GConexao
	 * com uma Singleton da GConexao 
	 **/	
	public RepSelecao(){
		conexao = GConexao.getInstancia();
	}
	
	/**
	 * Implemente��o do m�todo repons�vel para 
	 * salvar uma sele��o no banco de dados.
	 * 
	 * @author Esdras
	 * @param Selecao
	 * @return void
	 */
       @Override
	public void salvar(Selecao sel) throws ConexaoException,RepositorioException {
		
		Connection c = conexao.conectar();
		
		String sqlSalvaSel = "INSERT INTO selecao(nome_selecao,Pais_cod_pais,Copa_cod_copa,grupo_selecao, posicao_grupo_selecao)" +
							 "VALUES (?,?,?,?,?);";
		
		try {
			PreparedStatement pstm = c.prepareStatement(sqlSalvaSel);
			pstm.setString(1, sel.getNomeSelecao());
			pstm.setInt(2,sel.getPais().getCodPais());
			pstm.setInt(3,sel.getCopa().getCodCopa());
			pstm.setString(4,sel.getGrupoSelecao());
			pstm.setInt(5,sel.getPosicaoGrupo());
			pstm.executeUpdate();
			pstm.close();
		} catch (SQLException e) {
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}
	}
	/**
	 * @author Esdras
	 */
	@Override
	public Selecao consultar(int cod) throws ConexaoException,RepositorioException {
		
		Selecao s = null;
		Pais p = null;
		Copa co = null;
		
		Connection c = conexao.conectar();
		
		String sqlConsultCopById = "SELECT s.cod_selecao, s.nome_selecao,s.grupo_selecao,s.posicao_grupo_selecao,p.cod_pais,p.nome_pais,c.cod_copa, c.Pais_cod_pais, c.ano_copa, c.campeao_copa,c.vice_copa " +
                                            "FROM selecao as s INNER JOIN copa as c " +
					    "ON c.cod_copa = s.Copa_cod_copa " +
                                            "INNER JOIN pais as p ON p.cod_pais = s.Pais_cod_pais " +
					    "WHERE s.cod_selecao = ? "; 
		
		try {
			PreparedStatement pstm = c.prepareStatement(sqlConsultCopById);
			pstm.setInt(1,cod);
			ResultSet resut = pstm.executeQuery();
			
			if(resut.next()){
				
				p = new Pais();
				s = new Selecao();
				co = new Copa();
				
				p.setCodPais(resut.getInt("cod_pais"));
				p.setNomePais(resut.getString("nome_pais"));
				
				co.setCodCopa(resut.getInt("cod_copa"));
				co.setAnoCopa(resut.getInt("ano_copa"));
				co.setCampeao(resut.getString("campeao_copa"));
				co.setVice(resut.getString("vice_copa"));
				
				s.setCodSelecao(resut.getInt("cod_Selecao"));
				s.setNomeSelecao(resut.getString("nome_selecao"));
				s.setGrupoSelecao(resut.getString("grupo_selecao"));
				s.setPosicaoGrupo(resut.getInt("posicao_grupo_selecao"));
				
				s.setPais(p);
				s.setCopa(co);
			}
			
		} catch (SQLException e) {
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}
		
		return s;
	}
	/**
	 * @author Esdras
	 */
	@Override
	public Selecao consultar(String nome) throws ConexaoException,RepositorioException {
		
		Selecao s = null;
		Pais p = null;
		Copa co = null;
		
		Connection c = conexao.conectar();
		
		String sqlConsultCopById = "SELECT s.cod_selecao, s.nome_selecao,s.grupo_selecao,s.posicao_grupo_selecao,p.cod_pais,p.nome_pais,c.cod_copa, c.Pais_cod_pais, c.ano_copa, c.campeao_copa,c.vice_copa " +
                                            "FROM selecao as s INNER JOIN copa as c " +
					    "ON c.cod_copa = s.Copa_cod_copa " +
                                            "INNER JOIN pais as p ON p.cod_pais = s.Pais_cod_pais " +
                                            "WHERE s.nome_selecao = ? "; 
		
		try {
			PreparedStatement pstm = c.prepareStatement(sqlConsultCopById);
			pstm.setString(1,nome);
			ResultSet resut = pstm.executeQuery();
			
			if(resut.next()){
				
				p = new Pais();
				s = new Selecao();
				co = new Copa();
				
				p.setCodPais(resut.getInt("cod_pais"));
				p.setNomePais(resut.getString("nome_pais"));
				
				co.setCodCopa(resut.getInt("cod_copa"));
				co.setAnoCopa(resut.getInt("ano_copa"));
				co.setCampeao(resut.getString("campeao_copa"));
				co.setVice(resut.getString("vice_copa"));
				
				s.setCodSelecao(resut.getInt("cod_Selecao"));
				s.setNomeSelecao(resut.getString("nome_selecao"));
				s.setGrupoSelecao("grupo_selecao");
				s.setPosicaoGrupo(resut.getInt("posicao_grupo_selecao"));
				
				s.setPais(p);
				s.setCopa(co);
			}
			
		} catch (SQLException e) {
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}
		
		return s;
	}

	/**
	 * @author Esdras
	 */
	public void excluir(int cod) throws ConexaoException, RepositorioException {
			
		Connection c = conexao.conectar();
		
		String sqlExcluirSelecao = "DELETE FROM selecao WHERE(cod_selecao = ?)";
		
		try {
			
			PreparedStatement pstm = c.prepareStatement(sqlExcluirSelecao);
			pstm.setInt(1, cod);
			pstm.executeUpdate();
			pstm.close();
		
		} catch (SQLException e) {
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}

	}

	/**
	 * @author Esdras
	 */
	public void excluir(String nome) throws ConexaoException,RepositorioException {
		
		Connection c = conexao.conectar();
		
		String sqlExcluirAtividade = "DELETE FROM selecao WHERE(nome_selecao = ?)";
		
		try {
			
			PreparedStatement pstm = c.prepareStatement(sqlExcluirAtividade);
			pstm.setString(1, nome);
			pstm.executeUpdate();
			pstm.close();
		
		} catch (SQLException e) {
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}

	}
	/**
	 * @author Esdras
	 */
        @Override
	public Collection<Selecao> listar() throws ConexaoException,RepositorioException {
		
		Collection<Selecao> lista = new ArrayList<Selecao>();
		
		Selecao s = null;
		Pais p = null;
		Copa co = null;
		
		Connection c = conexao.conectar();
		
		String sqlConsultCopById = "SELECT s.cod_selecao, s.nome_selecao,s.grupo_selecao,s.posicao_grupo_selecao,p.cod_pais,p.nome_pais,c.cod_copa, c.Pais_cod_pais, c.ano_copa, c.campeao_copa,c.vice_copa " +
                                            "FROM selecao as s INNER JOIN copa as c " +
					    "ON c.cod_copa = s.Copa_cod_copa " +
                                            "INNER JOIN pais as p ON p.cod_pais = s.Pais_cod_pais "; 
		
		try {
			PreparedStatement pstm = c.prepareStatement(sqlConsultCopById);
			ResultSet resut = pstm.executeQuery();
			
			while(resut.next()){
				
				p = new Pais();
				s = new Selecao();
				co = new Copa();
				
				p.setCodPais(resut.getInt("cod_pais"));
				p.setNomePais(resut.getString("nome_pais"));
				
				co.setCodCopa(resut.getInt("cod_copa"));
				co.setAnoCopa(resut.getInt("ano_copa"));
				co.setCampeao(resut.getString("campeao_copa"));
				co.setVice(resut.getString("vice_copa"));
				
				s.setCodSelecao(resut.getInt("cod_Selecao"));
				s.setNomeSelecao(resut.getString("nome_selecao"));
				s.setGrupoSelecao(resut.getString("grupo_selecao"));
				s.setPosicaoGrupo(resut.getInt("posicao_grupo_selecao"));
				
				s.setPais(p);
				s.setCopa(co);
				
				lista.add(s);
			}
			
		} catch (SQLException e) {
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}
		
		
		return lista;
	}

}
